/* $Id tongying.cai@gmail.com 2011-7-2 05:15 exp$ */
#include <errno.h>
#include <bolt.h>
#include <prot.h>
#include "basic.h"

BOLT(udp_show, "udp show")
{
   udp_show();
}

BOLT(udp_release, "udp <id> release")
{
  uint32_t udp_id;
  
  if(!str2u32(pop_argz(), &udp_id)) {
    printf("Invalid udp id.\n");
    return;
  }
  udp_release((int)udp_id);
}

static uint8_t udp_test_buf[MAX_PKT_LEN];

BOLT(udp_send, "udp <id> send <dst-ip> <dst-port>")
{
   uint32_t udp_id;
   sockaddr_t dst;
   int len;
   uint16_t port;
   
   memset(&dst, 0, sizeof(dst));
   if (!str2u16(pop_argz(), &port)) {
      printf("Invalid destination port\n");
      return;
   }
   if (!ip2addr(pop_argz(), &dst.v0)) {
      printf ("Invalid destination IP.\n");
      return;
   }
   addr_set_port(&dst, port);  
   if (!str2u32(pop_argz(), &udp_id)) {
      printf("Invalid ID\n");
      return;
   }
   len = udp_send((int)udp_id, &dst, udp_test_buf, MAX_PKT_LEN);
   printf("Send udp in id %u, len=%d\n", udp_id, len);
}

BOLT(udp_create, "udp <id> create <src-ip> <dst-port>")
{
   uint32_t udp_id;
   int id;
   sockaddr_t src;
   uint16_t port;
   memset(&src, 0, sizeof(src));
   if (!str2u16(pop_argz(), &port)) {
      printf("Invalid source port.\n");
      return;
   }
   if (!ip2addr(pop_argz(), &src.v0)) {
      printf ("Invalid source IP.\n");
      return;
   }
   addr_set_port(&src, port);
   if (!str2u32(pop_argz(), &udp_id)) {
      printf("Invalid udp id.\n");
      return;
   }
   id = udp_alloc((int)udp_id, &src);
   if (id < 0)
      printf("The udp id is %d, error: %s\n", id, strerror(errno));
   else
      printf("The udp id is %d\n", id);
}
